package com.example.spring.service.impl;

import com.example.spring.entity.User;
import com.example.spring.exception.ServiceException;
import com.example.spring.Mapper.UserMapper;
import com.example.spring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户服务实现类
 * 实现UserService接口定义的所有方法
 * 处理与用户相关的所有业务逻辑
 */
@Service
public class UserServiceImpl implements UserService {
    /**
     * 注入UserMapper，用于数据库操作
     */
    @Autowired
    private UserMapper userMapper;

    /**
     * 插入新用户
     * @param user 用户对象
     */
    @Override
    public void insertUser(User user) {
        userMapper.insertUser(user);
    }

    /**
     * 更新用户信息
     * @param user 包含更新数据的用户对象
     */
    @Override
    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    /**
     * 删除一个用户
     * @param id 用户ID
     */
    @Override
    public void deleteOneUser(Integer id) {
        userMapper.deleteOne(id);
    }

    /**
     * 批量删除用户
     * @param ids 用户ID列表
     */
    @Override
    public void deleteManyUser(List<Integer> ids) {
        for (Integer id: ids) {
            userMapper.deleteOne(id);
        }
    }

    /**
     * 查询所有用户
     * @return 用户列表
     */
    @Override
    public List<User> selectAll() {
        return userMapper.selectAll();
    }

    /**
     * 根据ID查询用户
     * @param id 用户ID
     * @return 用户对象
     */
    @Override
    public User selectById(Integer id) {
        return userMapper.selectById(id);
    }

    /**
     * 多条件精确查询用户
     * @param username 用户名
     * @param name 姓名
     * @return 满足条件的用户列表
     */
    @Override
    public List<User> selectByMore(String username, String name) {
        return userMapper.selectByMore(username, name);
    }

    /**
     * 模糊查询用户
     * @param username 用户名(模糊匹配)
     * @param name 姓名(模糊匹配)
     * @return 满足条件的用户列表
     */
    @Override
    public List<User> selectLike(String username, String name) {
        return userMapper.selectLike(username, name);
    }

    /**
     * 分页查询用户
     * @param pageNum 页码
     * @param pageSize 每页记录数
     * @param username 用户名(模糊匹配)
     * @param name 姓名(模糊匹配)
     * @return 包含分页数据和总记录数的Map
     */
    @Override
    public Map<String, Object> selectByPage(Integer pageNum, Integer pageSize, String username, String name) {
        Map<String, Object> map = new HashMap<>();

        int skipNum = (pageNum - 1) * pageSize;

        // 获得满足条件的记录
        List<User> users = userMapper.selectByPage(skipNum, pageSize, username, name);

        // 总条数
        Integer total = userMapper.selectCount(username, name);

        map.put("list", users);
        map.put("total", total);

        return map;
    }

    /**
     * 用户登录业务逻辑
     * 验证用户名和密码是否正确
     * @param user 包含登录信息的用户对象
     * @return 验证成功的用户信息
     * @throws ServiceException 当用户名不存在或密码错误时抛出异常
     */
    @Override
    public User login(User user) {
        User dbUser = userMapper.selectByUsername(user.getUsername());

        // 用户名不存在
        if(dbUser==null){
            throw new ServiceException("用户名或密码错误");
        }

        // 密码不正确
        if(!dbUser.getPassword().equals(user.getPassword())){
            throw new ServiceException("用户名或密码错误");
        }

        return dbUser;
    }

    /**
     * 用户注册业务逻辑
     * 检查用户名是否已存在，创建新用户
     * @param user 包含注册信息的用户对象
     * @return 创建成功的用户信息
     * @throws ServiceException 当用户名已存在时抛出异常
     */
    @Override
    public User register(User user) {
        User dbUser = userMapper.selectByUsername(user.getUsername());

        if(dbUser!=null){
            throw new ServiceException("用户名已存在");
        }

        user.setName(user.getUsername());
        userMapper.insertUser(user);

        return user;
    }
}
